Named এবং Unnamed Sockets-এর মধ্যে পার্থক্য এবং তাদের কাজের পদ্ধতি সম্পর্কে আলোচনা করা হলো:
Unnamed Sockets হলো এমন একটি socket যা কোনো নির্দিষ্ট নাম বা ঠিকানা সংযুক্ত ছাড়াই তৈরি হয়। এটি সাধারণত Inter-Process Communication (IPC) এর জন্য প্রক্রিয়াগুলোর মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়।
Unnamed Sockets তৈরি করতে সাধারণত socketpair() ফাংশন ব্যবহার করা হয়। নিচে একটি উদাহরণ দেওয়া হলো:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
int main() {
int sockets[2];
char buffer[100];
// 1. Socket pair তৈরি করা
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) {
perror("socketpair");
exit(EXIT_FAILURE);
}
if (fork() == 0) { // Child process
close(sockets[0]);
char *message = "Hello from child";
write(sockets[1], message, strlen(message));
close(sockets[1]);
} else { // Parent process
close(sockets[1]);
read(sockets[0], buffer, sizeof(buffer));
printf("Parent received: %s\n", buffer);
close(sockets[0]);
}
return 0;
}
Named Sockets হলো এমন একটি socket যা একটি নির্দিষ্ট নাম বা পাথ (path) ব্যবহার করে তৈরি করা হয়। এটি Unix Domain Sockets (UDS) এর একটি উদাহরণ, যেখানে একটি সুনির্দিষ্ট পাথ বা নাম ব্যবহার করে IPC (Inter-Process Communication) সম্পন্ন করা হয়। Named Sockets সাধারণত ফাইল সিস্টেমের একটি অংশ হিসেবে তৈরি হয়।
/tmp
ডিরেক্টরিতে বা সিস্টেমের অন্য কোনো অংশে তৈরি করা হয়।নিচে একটি Named Socket-এর উদাহরণ দেওয়া হলো, যেখানে Unix Domain Socket ব্যবহার করে একটি সার্ভার এবং ক্লায়েন্ট তৈরি করা হয়েছে:
Server Program (C ভাষায়):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/named_socket"
int main() {
int server_fd, client_fd;
struct sockaddr_un server_addr;
char buffer[100];
// 1. Socket তৈরি করা
if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. ঠিকানা সেটআপ করা
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);
// 3. Binding করা
unlink(SOCKET_PATH);
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 4. Listening করা
if (listen(server_fd, 5) < 0) {
perror("Listen failed");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Server is listening...\n");
// 5. Accepting সংযোগ
if ((client_fd = accept(server_fd, NULL, NULL)) < 0) {
perror("Accept failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 6. ডেটা গ্রহণ করা
read(client_fd, buffer, sizeof(buffer));
printf("Client: %s\n", buffer);
// 7. Socket বন্ধ করা
close(client_fd);
close(server_fd);
unlink(SOCKET_PATH);
return 0;
}
Client Program (C ভাষায়):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/named_socket"
int main() {
int client_fd;
struct sockaddr_un server_addr;
// 1. Socket তৈরি করা
if ((client_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 2. সার্ভার ঠিকানা সেটআপ করা
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);
// 3. সার্ভারের সাথে সংযোগ স্থাপন করা
if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Connection failed");
close(client_fd);
exit(EXIT_FAILURE);
}
// 4. ডেটা পাঠানো
char *message = "Hello from client";
write(client_fd, message, strlen(message));
// 5. Socket বন্ধ করা
close(client_fd);
return 0;
}
বৈশিষ্ট্য | Unnamed Sockets | Named Sockets |
---|---|---|
ঠিকানা ব্যবহার | কোনো নাম বা ঠিকানা ব্যবহার করে না | একটি নির্দিষ্ট নাম বা পাথ ব্যবহার করে |
ব্যবহার | Parent এবং Child process এর মধ্যে সাময়িক IPC | দীর্ঘমেয়াদী বা স্থায়ী IPC এর জন্য |
ফাইল সিস্টেম | ফাইল সিস্টেমের ওপর নির্ভর করে না | ফাইল সিস্টেমের অংশ হিসেবে কাজ করে |
লোকাল বা রিমোট | শুধুমাত্র একই সিস্টেমে কাজ করে | শুধুমাত্র একই সিস্টেমে কাজ করে |
ব্যবহারিক উদাহরণ | socketpair() API | Unix Domain Sockets (AF_UNIX, SOCK_STREAM) |
common.read_more